package dancereal;

public class J15_OOP1 {

	// 객체지향 개발 기법
	// OOP : 객체를 기반으로 프로그램을 작성하는 것
	// OOP 언어로 응용 프로그램을 개발하는 경우,
	// 문제 해결을 위해 실제 상황과 유사한 모델을
	// 만들어야 함
	
	// 예를 들어, 직원 세금을 계산하는 프로그램 작성
	// 프로그램에서 회사를 표현하는 회사객체가 필요
	// 또한, 직원을 나타내는 직원 객체, 세금을 나타내는 
	// 세금객체도 필요
	
	// 회사, 직원, 세금 객체를 자바 프로그램에서 
	// 코드로 나타내는 방법에 대해 알아봄
	
	// 모든 객체에는 2가지 성질이 있음
	// [속성 property], 객체가 할 수 있는 [행동 action]
	// 현실세계에 존재하는 객체를 자바언어로 
	// 가져오는 경우에도 속성과 행위는 있어야 함
	// 자바에서 속성은 field, 행위는 method 라 함
	// 단, 필드와 메서드는 선택사항(생략가능)임
	
	// 자바 객체를 만드는 방법은? - 설계도를 이용
	// 차 라는 객체를 잘 만드려면
	// 좋은 차를 만들어 주는 [설계도]를 참고
	// OOP 에서 객체를 만들어주는 설계도를 [클래스]라 함
	
	// 클래스는 동일한 유형의 객체를 만드는
	// 청사진/설계도 또는 템플릿임 (중요!)
	// 붕어빵 - 객체
	// 붕어빵 틀 - 클래스
	// 밀가루, 팥 - 속성
	// 클래스는 당신이 만들려는 객체의 종류를 결정함
    
	// 요약하자면, 클래스는 프로그래머로 하여금
	// 문제의 추상화를 만들 수 있게 해주는 OOP 도구임
	// OOP에서 추상화 abstraction 는 실제 객체를 표현하기
	// 위해 실제 객체에서 핵심적인 개념 또는 기능을 뽑아 
    // 프로그래밍 객체로 만드는 행위를 말함
	
	// 자바 초보자는 클래스를 작성할 때
	// 클래스 이름, 필드, 메서드 등을 고려할 것
	
	// 클래스 만들기
	// class 클래스이름{
	//       클래스몸체(필드,메서드)
	// }
	
	/* 클래스의 이름은 반드시 대문자로 시작
	 * 클래스 정의시 클래스 이름과 파일 이름은
	 * 동일해야 함
	 * 클래스 내에 선언된 변수를 필드라 함
	 * */
	
	
	
	public static void main(String[] args) {
	
	/* 클래스를 사용하지 않고 학생 객체 생성 */
	/*	
		String name = "김태희";
		int stdno = 123456789;
		String addr ="부산 남구 문현동";
		int mp = 1234567890;
		
		String name2 = "송혜교";
		int stdno2 = 234567890;
		String addr2 ="부산 남구 문현동";
		int mp2 = 345678901;*/
		
	/* 클래스를 이용해서 학생 객체 생성 */
		
		

		/*Student taehee = new Student();
		taehee.name = "태희";
		taehee.stdno = 123456789;
		taehee.addr = "부산 남구 문현동";
		taehee.mp = 1234567890;
	
		Student suji = new Student();
		suji.name = "수지";
		suji.stdno = 234567890;
		suji.addr = "서울 광진구 자양동";
		suji.mp = 1234567890;*/
		
		// 생성자를 이용한 학생 객체 생성
		Student one = new Student();
		System.out.println(one.name);
		
		Student two = new Student();
		System.out.println(two.name);
		
		Customer three = new Customer();
		System.out.println(three.userid);
		
		Customer four = new Customer();
		System.out.println(four.passwd);
		
		Product five = new Product();
		System.out.println(five.maker);
		
		Product six = new Product();
		System.out.println(six.pname);
		
		TerranUnit seven = new TerranUnit();
		System.out.println(seven.mineral);

		TerranUnit eight = new TerranUnit();
		System.out.println(eight.time);
		
	} // main
} //class

/* 학생 클래스 정의 */
class Student{
	// 필드 선언 
	String name;
	int stdno;
	String addr;
	int mp;
	
	// 생성자 추가 - 객체를 초기화하는데 사용
	public Student(){
	name = "아무개";
	stdno = 12345; 
	addr = "서울";
	mp = 987654;
	}
}
/* 고객(Customer) 클래스
 * 아이디, 비밀번호, 이름, 주소, 전화번호, 이메일 */
class Customer{
	String userid;
	String passwd;
	String name;
	String addr;
	String mp;
	String email;
	
	public Customer(){
	userid = "도레미";
	passwd = "모르쇠";
	name = "홍길동";
	addr = "부산";
	
	
	
	}
}
	
 /* 상품 (Product) 클래스
 * 상품번호, 상품명, 가격, 종류, 제조사 */ 
	
class Product{
	String pnum;
	String pname;
	int price;
	String type;
	String maker;
	
	public Product(){
	pnum = "PCI58493";
	pname = "토드백";
	price = 7600000;
	type = "BAG";
	maker = "CHANEL";
	}
}
 /* 스타크래프트 2의 테란 유닛(TerranUnit)을
 * 클래스로 정의
 * 생명력, 에너지, 방어력
 * 광물, 베스핀, 보급품, 생산시간 */
	
	class TerranUnit{
		int hp;
		int energy;
		int armor;
		int mineral;
		int vespine;
		int supply;
		int time;
		
	public TerranUnit(){
		hp = 150;
		energy = 100;
		armor = 2;
		mineral = 250;
		vespine = 150;
		supply = 4;
		time = 150;
	}
	
	
	} 